package ch.zbw.vokabeltrainer.logik;

import java.util.ArrayList;

public class Management {

	private ArrayList<Benutzer> benutzer;// User Liste aller Benutzer Objekte

	private int aktBenutzerIndex;// Aktueller User Index

	private SprachenKomb sprachenKomb;// Aktuelle Srpachenwahlliste
	private Thema lektionen;// Aktuelle LernLektion
	private Karteikarte karteikarten;// Aktuelle Karteikarte

	private Laden laden;//Obecjt um alle laden Methoden ausfueren von der Datenbank
	private Speichern speichern;//Object um alle Speichern und aendern methoden ausfueren auf der Datenbank
	private LernBoxStufe lbs;//Object um KarteikartenBox fuellen

	/**
	 * Dieser Konstrukter erstellt ein Managemend Objekt das den UserIndex
	 * Initalisiert und eine UserArrayList erstellt Das Management Object wird
	 * mit der Klasse DB verknuepft.
	 * 
	 */
	public Management() {
		this.benutzer = new ArrayList<Benutzer>();
		aktBenutzerIndex = -1;
		laden = new Laden(this);
		speichern = new Speichern();
		laden.nurBenutzerLaden();
		lbs = new LernBoxStufe(this);
	}

	/**
	 * Diese Methode erstellt ein neuen User
	 * 
	 * @param userName
	 */
	public void newBenutzer(String userName) {
		this.aktBenutzerIndex -= this.benutzer.indexOf(benutzer
				.add(new Benutzer(userName)));
		
	}
	/**
	 * Methode um einen neuen Benutzer erstellen vom Program aus diese Methode Speicher neue Benutzer im Array und auf der Datenbank
	 * 
	 * @param userName String
	 * @return true speicherung OK false benutzer schon vorhanden
	 */
	 public boolean newBenutzerDB(String userName){
		if(this.benutzerVorhanden(userName)){
			this.aktBenutzerIndex -= this.benutzer.indexOf(benutzer
				.add(new Benutzer(userName)));
			speichern.benutzerSpreichern(userName);
			return true;
		}else if(userName==""){
			return false;
		}else{
			return false;
		}
	 }

	/**
	 * Diese Medthode erstellt eine neue SprachWahl Rubrik Sie wir ueber den
	 * User Index erstellt damit diese Spaehter wirder ueber den User gefunden
	 * werden kann.
	 *Diese methode wird nur gebraucht um Spraceh laden die auf der Datenbank vorhanden sind
	 * 
	 * @param lernSprache die neue Sprache als String
	 */
	public void newSprachenKombErstellen(String lernSprache) {
		this.sprachenKomb = this.benutzer.get(aktBenutzerIndex)
				.newSprachenKomb(lernSprache);
	}
	/**
	 * Diese Methode erstellt ein neus Thema in der ArrayListe und auf der Datenbank
	 * 
	 * @param lernSprache String
	 * @return boolean true speicherung OK false sprache schon vorhanden
	 */
	public boolean newSprachenKombErstellenDB(String lernSprache){
		if(this.spracheVorhanden(lernSprache)){
			this.sprachenKomb = this.benutzer.get(aktBenutzerIndex)
				.newSprachenKomb(lernSprache);
			speichern.spracheSpeichern(getAktBenutzerName(), lernSprache);
			return true;
		}else if(lernSprache==""){
			return false;
		}else{
			return false;
		}
	}

	/**
	 * Diese Methode erstellt eine neue Lektion(Thema der Lehrnrubrik) Sie wird
	 * ueber die SprachenWahl-Index erstellt damit diese Spaehter ueber den
	 * User gefunden werden kann.
	 * 
	 * Dise Methode wird nur gebraucht um vond er Datenbank Themas zu laden
	 * 
	 * @param lektionenName
	 */
	public void newThemaErstellen(String lektionenName) {
		this.lektionen = this.sprachenKomb.newLektion(lektionenName);
	}
	/**
	 * Diese Methode erstellt eine neue Lektion in der Arrayliste und auf der Datenbank
	 * 
	 * @param lektionenName String
	 * @return boolean true speicherung OK false thema schon vorhanden
	 */
	public boolean newThemaErstellenDB(String lektionenName){
		if(this.lernThemaVorhanden(lektionenName)){
			this.lektionen = this.sprachenKomb.newLektion(lektionenName);
			speichern.themaSpeichern(getAktBenutzerName(), lektionenName);
			return true;
		}else if(lektionenName==""){
			return false;
		}else{
			return false;
		}
	}

	/**
	 * Diese Methode erstellt eine neue Lehrnkarteikarte Sie wird ueber die
	 * Lektionen-Index erstellt damit diese Spaehter wieder gefunden werden
	 * kann ueber den User oder Lektion
	 * 
	 * @param wortSprache1 String
	 * @param wortSprache2 String
	 */
	public void newKarteikarteErstellen(String wortSprache1, String wortSprache2){
		if(wortSprache1==""&&wortSprache2==""){	
		}
		else{
			this.lektionen.newKarteikarte(wortSprache1, wortSprache2);
			speichern.karteSpeichern(this.getAktBenutzerName(), this.getAktSprache(), wortSprache1, wortSprache2, this.getAktThema());
		}
	}
	/**
	 * Dise Methode wird nur gebraucht um Karteikarten zu erstellen aus der Datenbank die ein koennen schon haben.
	 * 
	 * @param wortSprache1 String
	 * @param wortSprache2 String
	 * @param koennen Integer
	 */
	public void newKarteikarteErstellenMitKoennen(String wortSprache1,
			String wortSprache2, int koennen) {
		this.lektionen.newKarteikarteMitKoennen(wortSprache1, wortSprache2,
				koennen);
	}

	/**
	 * Diese Methode erstellt ein Array mit allen vorhanden UserNamen
	 * 
	 * @return StringArray UserNameListe
	 */
	public String[] getBenutzerListe() {
		String[] userListe;
		userListe = new String[benutzer.size()];
		int i = 0;
		for (Benutzer name : benutzer) {
			userListe[i] = name.getUsername();
			i++;
		}
		return userListe;
	}

	/**
	 * Diese Methode convertiert die Userliste ind ein Array das die Username
	 * als String abspeichert.
	 * 
	 * @return StringArray SprachenWahl
	 */
	public String[] getSprachenKomb() {
		this.benutzer.get(aktBenutzerIndex).sprachenKombLoeschen();
		laden.nurSprachenLaden(this.getAktBenutzerName());
		ArrayList<SprachenKomb> list = new ArrayList<>();
		list = benutzer.get(aktBenutzerIndex).getSprachenWahlArray();
		String[] sprachenWahlen;
		sprachenWahlen = new String[list.size()];
		int i = 0;
		for (SprachenKomb sprachen : list) {
			sprachenWahlen[i] = sprachen.getLernSprache();
			i++;
		}
		return sprachenWahlen;
	}

	/**
	 * Diese Methode convertiert die die LehrnSprachen in einen String und giebt
	 * alle Sprachvarianten in einem Array zurueck.
	 * 
	 * @return StringArray Lektionen
	 */
	public String[] getThemaListe() {
		this.sprachenKomb.sprachenLoeschen();
		laden.nurThemaLaden(this.getAktBenutzerName());
		ArrayList<Thema> list = new ArrayList<>();
		list = sprachenKomb.getLektionenListe();
		String[] lektionenlist;
		lektionenlist = new String[list.size()];
		int i = 0;
		for (Thema lektionen : list) {
			lektionenlist[i] = lektionen.getlektion();
			i++;
		}
		return lektionenlist;
	}

	/**
	 * Diese Methode sucht den Benutzer Index und gibt diesen als String
	 * zurueck. Diese Methode wird nur Intern verwendet
	 * 
	 * @param benutzer
	 * @return benutzerIndex ArrayList
	 */

	private int benutzerIndexSuchen(String benutzer) {
		int i = 0;
		for (Benutzer name : this.benutzer) {
			if (name.getUsername().equals(benutzer)) {
				return i;
			} else {
				i++;
			}

		}
		return -1;
	}

	/**
	 * Diese Methode setzt den Aktuellen Benutzer zum gesuchten Benutzer
	 * 
	 * @param gesuchterBenutzer
	 */
	public void benutzerIndexSetzen(String gesuchterBenutzer) {
		aktBenutzerIndex = this.benutzerIndexSuchen(gesuchterBenutzer);
	}

	/**
	 * Diese Methode setzt die Aktuelle Sprachkombination
	 * 
	 * @param gesuchteSprachenKomb
	 */
	public void sprachenKombAktualisieren(String gesuchteSprachenKomb) {
		sprachenKomb = this.sprachenKombSuchen(gesuchteSprachenKomb);
	}

	/**
	 * Diese Methode sucht die Aktuele Sprachkombination heraus und gibt diese
	 * zurueck Diese wird nur intern verwendet
	 * 
	 * @param sprachenKomb
	 * @return SprachKombination Object
	 */
	private SprachenKomb sprachenKombSuchen(String sprachenKomb) {
		ArrayList<SprachenKomb> sp = benutzer.get(aktBenutzerIndex)
				.getSprachenWahlArray();
		for (SprachenKomb sprachen : sp) {
			if (sprachen.getLernSprache().equals(sprachenKomb)) {
				return sprachen;
			}
		}
		return null;
	}

	/**
	 * Diese Methode setzt das Aktuelle Thema inder Variable
	 * 
	 * @param gesuchtesThema
	 */
	public void themaAktualisieren(String gesuchtesThema) {
		lektionen = this.lernThemaSuchen(gesuchtesThema);
	}

	/**
	 * Diese Methode wird nur intern verwendet um LernThema zu suchen
	 * 
	 * @param thema
	 * @return Thema Objectreferenz
	 */
	private Thema lernThemaSuchen(String thema) {
		ArrayList<Thema> th = sprachenKomb.getLektionenListe();
		for (Thema them : th) {
			if (them.getlektion().equals(thema)) {
				return them;
			}
		}
		return null;
	}
	/**
	 * Gibt das Aktuelle Thema Object zurueck
	 * 
	 * @return thema Object
	 */
	public Thema getThema() {
		return lektionen;
	}
	/**
	 * Gibt die naechste abfrage Karte zurueck
	 * 
	 * @return frageWort String
	 */
	public String nechsteKarte() {
		this.lektionen.themaLoeschen();
		laden.nurKarteienLaden(this.getAktBenutzerName(), this.getAktSprache(),
				this.getAktThema());
		lbs.sortieren();
		karteikarten = lbs.getKarteikarte();
		return karteikarten.getWortSprache1();
	}
	/**
	 * Diese Methode kontroliert das wort das eingegben wurde ob dies die Korrekte antwort ist
	 * Gross Klein schreibung wird nicht ueberprueft
	 * 
	 * @param text
	 * @return true fuer richtig false fuer falsch
	 */
	public boolean kontrolle(String text) {
		if (karteikarten.getWortSprache2().toLowerCase().equals(text.toLowerCase())){
			karteikarten.setLernerfolg(karteikarten.getLernerfolg() + 1);
			speichern.koenenAendern(this.karteikarten.getWortSprache1(), this.karteikarten.getWortSprache2(),
					this.getAktBenutzerName(), this.karteikarten.getLernerfolg());
			return true;
		} else {
			karteikarten.setLernerfolg(0);
			speichern.koenenAendern(this.karteikarten.getWortSprache1(), this.karteikarten.getWortSprache2(),
					this.getAktBenutzerName(), this.karteikarten.getLernerfolg());
			return false;
		}
	}
	/**
	 * Gibt den aktuellen Benutzername als String zurueck
	 * 
	 * @return benutzerName String
	 */
	public String getAktBenutzerName() {
		return benutzer.get(aktBenutzerIndex).getUsername();
	}
	/**
	 * Gibt die aktuelle Sprache zurueck als String
	 * 
	 * @return sprache String
	 */
	public String getAktSprache() {
		return sprachenKomb.getLernSprache();
	}
	/**
	 * Gibt das aktuelle Thema zurueck als String
	 * 
	 * @return Thema String
	 */
	public String getAktThema() {
		return lektionen.getlektion();
	}
	/**
	 * Gibt die Wortliste des aktuellen Thema als 2 dimensionen Array zurueck
	 * 
	 * @return Wortliste 2Dim Array
	 */
	public String[][] getWortliste() {
		this.lektionen.themaLoeschen();
		laden.nurKarteienLaden(this.getAktBenutzerName(), this.getAktSprache(),
				this.getAktThema());
		ArrayList<Karteikarte> lek = lektionen.getKarteikarten();
		String[][] wortliste = new String[lek.size()][3];
		int c = 0;
		for (Karteikarte li : lek) {
			wortliste[c][0] = li.getWortSprache1();
			wortliste[c][1] = li.getWortSprache2();
			wortliste[c][2] = new Integer(li.getLernerfolg()).toString();
			c++;
		}
		return wortliste;
	}
	/**
	 * Gibt das aktuelle Frage wort zurueck
	 * 
	 * @return wort1 String
	 */
	public String getAktuellesWort() {
		return this.karteikarten.getWortSprache1();
	}
	/**
	 * Dise Methode fuert das Exportieren der Woerter aus
	 * 
	 * @param file filepfad des exports auf dem  System
	 */
	public void woerterExportieren(String file) {
		new Export(lektionen.getKarteikarten(), file);
	}	
	/**
	 * Dise Methode fürt das importieren des gewaehlten Dokumenten pfads aus
	 * 
	 * @param file filepfasd des ligenden imports file
	 */
	public void woerterImportieren(String file) {
		ArrayList<String> woerter = new Import().importieren(file);
		String wort1;
		String wort2;
		for(int i=0;i < woerter.size();i+=2) {
			wort1 = woerter.get(i);
			wort2 = woerter.get(i+1);
			newKarteikarteErstellen(wort1, wort2);
		}
	}
	/**
	 * Ueberprueft ob der gesuchte Benutzer schon vorhanden ist
	 * 
	 * @param name String
	 * @return false fuer ist vorhanden true gibt ihn noch nicht
	 */
	private boolean benutzerVorhanden(String name){
		for(Benutzer user:this.benutzer){
			if(user.getUsername().equals(name)){
				return false;
			}	
		}
		return true;
	}
	/**
	 * Ueberprueft die Sprache ob diese schon vorhanden ist
	 * 
	 * @param name
	 * @return false fuer vorhanden true gibt ihn noch nicht
	 */
	private boolean spracheVorhanden(String name){
		ArrayList<SprachenKomb> sp = benutzer.get(aktBenutzerIndex)
				.getSprachenWahlArray();
		for (SprachenKomb sprachen : sp) {
			if (sprachen.getLernSprache().equals(name)) {
				return false;
			}
		}
		return true;
	}
	/**
	 * Ueberprueft das Thema ob dies schon vorhanden ist
	 * 
	 * @param name
	 * @return false fuer vorhanden true gibt ihn noch nicht
	 */
	private boolean lernThemaVorhanden(String name) {
		ArrayList<Thema> th = sprachenKomb.getLektionenListe();
		for (Thema them : th) {
			if (them.getlektion().equals(name)) {
				return false;
			}
		}
		return true;
	}
	/**
	 * Gibt das Loesungs wort zurueck
	 * 
	 * @return wortloesung
	 */
	public String getLoesungWort(){
		return karteikarten.getWortSprache2();
	}
	/**
	 * Loescht das Wort auf der Datenbank
	 * 
	 * @param wortSprache1 String
	 * @param wortSprache2 String
	 */
	public void wortloeschen(String wortSprache1, String wortSprache2){
		speichern.loescheWort(wortSprache1, wortSprache2, getAktBenutzerName());
	}
	/**
	 * Loescht das Thema auf der Datenbank
	 * 
	 * @param thema String
	 */
	public void themaloeschen(String thema){
		speichern.loescheThema(thema, this.getAktBenutzerName());
	}
	/**
	 * Loescht die Sprache auf der Datenbank
	 * 
	 * @param sprache String
	 */
	public void spracheloeschen(String sprache){
		speichern.loescheSprache(sprache, this.getAktBenutzerName());
	}
	/**
	 * Loescht den Benutzer auf der Datenbank
	 * 
	 * @param benutzer String
	 */
	public void benutzerloeschen(String benutzer){
		speichern.loescheBenutzer(benutzer);
		this.benutzer = new ArrayList<Benutzer>();
		this.laden.nurBenutzerLaden();
	}
}